File Inclusion 原理分析及利用
有些脚本语言(如php)允许开发者将可以重复使用的代码直接插入到某个文件中,同时被包含文件中的代码将执行。这里以php为例,通过将php.ini中设置allow_url_include = on和allow_url_fopen= on,并使用require(), require_once(), include(), include_once()等函数便可实现该功能,然而如果未对包含的文件做控制,可能会产生无法预期的后果,因为不管包含的文件是什么类型,都会优先尝试当作php文件执行,如果文件内容有php代码,则会执行php代码并返回代码执行的结果,如果文件内容没有php代码,则把文件内容打印出来。文件包含漏洞包括本地文件包含和远程文件包含两大类。
本地文件包含
本地文件包含指的是攻击者利用该漏洞让网站返回其服务器的一些本地信息(如passwd),造成信息泄露等危害。这里以DVWA中的File Inclusion 模块为例。
图中,表面上显示我们在这里仅能打开file1.php 等文件,然而实际上我们可以在请求的url中添加绝对路径来访问其他的文件。比如下图中,通过将page后面的参数改为php.ini文件的绝对路径便可以非法的读取该敏感文件的内容。
在不知道绝对路径的情况下,也可以通过相对路径来实现利用,如下图所示。
远程文件包含
本地文件包含会带来文件泄漏的影响,然而由于需要知道相对路径乃至绝对路径,因此不一定能够利用成功,远程文件包含带来的破坏比本地文件包含更为严重。
为了利用远程文件包含,攻击者首先将恶意的脚本文件(如木马文件)上传至远程主机上,随后将文件包含指向该主机上的恶意文件,来实现任意代码执行。
上图中,首先在pluck网站上新建了一个txt文件,其中的内容为phpinfo()函数,随后回到DVWA中,改变url指向该远程主机,结果显示test中的php代码执行成功。
预防文件包含漏洞
在DVWA的Flie Inclusion模块的Medium和High难度中试图使用关键词转义和文件名限制等手段来预防文件包含漏洞。上图中试图通过将http等关键词转义来预防该漏洞,然而我们可以使用双写、大小写乃至各种编码方式来绕过该预防措施。
这里通过使用浏览器的File协议,通过”File:///绝对路径”的方式依然可以绕过该措施并实现本地文件包含。
在Impossible难度的源码中,给出了最简单的预防该漏洞的方式,通过白名单控制用户的输入,仅接受白名单内合法的输入并返回结果。